package com.zjq.designpatterns.behaviors.templatemethod.code;/*
 * 版权信息: 北京千⾥马网信科技有限公司</br>
 * Copyright ©2008-2018. All rights reserved. 京ICP备16007318号
 */

/**
 * 该类是为了制作模板
 *
 * @author jessie
 * @version 1.0
 * @date 2021/1/24
 */
public abstract class ACourse {
    //final ACourse是不想被修改的  关键方法
    //一定要加final ,不然子类可以重写这个makeCourse方法, 模板方法就是不想把这个算法流程打乱
    protected final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        //因为写手记是可选的，所以使用钩子方法来实现,这里开放出去，
        if(needWriteArticle()){
            this.writeArticle();
        }
        // packageCourse完全交给子类去实现
        this.packageCourse();
    }

    //制作ppt
    final void makePPT(){
        System.out.println("制作PPT");
    }

    final void makeVideo(){
        System.out.println("制作视频");
    }

    //注意，一定要加final
    final void writeArticle(){
        System.out.println("编写手记");
    }

    //钩子方法
    protected boolean needWriteArticle(){
        return false;
    }

    //包装课程
    abstract void packageCourse();

}
